package com.lhy.tool.autoconfigation;

import com.lhy.common.web.util.LocalDateTimeUtil;
import com.lhy.tool.database.DateType;
import com.lhy.tool.util.StringUtil;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.boot.context.properties.ConfigurationProperties;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author hyluan
 * @ClassName: GeneratorProperties
 * @Description:代码生成器属性
 * @date 2018年1月5日 下午1:21:19
 * @Copyright: Copyright (c) 2017 wisedu
 */
@Getter
@Setter
@ConfigurationProperties(prefix = "crud-gen")
public class GeneratorProperties {

    private GlobalConfig globalConfig = new GlobalConfig();

    private DataBaseConfig dataBaseConfig = new DataBaseConfig();

    @Data
    public static class GlobalConfig {

        /**
         * 项目属性  前端项目路径和后端项目路径
         */
        private Project project;

        /**
         * freemarker模板路径 resources目录下
         */
        private String templatePath = "/templates";

        /**
         * 文档注释信息
         */
        private DocInfo docInfo = new DocInfo();

        /**
         * 是否生成model(java)文件
         */
        private boolean modelEnabled = true;

        /**
         * 是否生成controller(java)文件
         */
        private boolean controllerEnabled = true;

        /**
         * 是否生成js文件
         */
        private boolean jsEnabled = true;
        /**
         * 是否生成视图文件
         */
        private boolean viewEnabled = true;
        /**
         * 是否生成分页参数(java)文件
         */
        private boolean pageModelParamEnabled = true;
        /**
         * 是否生成service(java)文件
         */
        private boolean serviceEnabled = true;
        /**
         * 是否生成sql文件
         */
        private boolean sqlEnabled = true;

        /**
         * 是否生成mapper.java文件
         */
        private boolean mapperEnabled = true;

        /**
         * 是否生成mapper.xml文件
         */
        private boolean mapperXmlEnabled = true;

        /**
         * 忽略大小写
         */
        private boolean ignoreCase = true;

        /**
         * 包名
         */
        private String packageName;

        /**
         * 文件名格式
         */
        private String controllerFomatter = "%sController";
        private String serviceFomatter = "%sService";
        private String mapperFomatter = "%sMapper";
        private String mapperXmlFomatter = "%sMapper";

        /**
         * 日期类型
         */
        private DateType dateType = DateType.TIME_PACK;


        /**
         * 日期增加dateformat注解
         */
        private boolean localDateFormatEnabled = true;




        @Data
        public static class DocInfo {
            /**
             * 作者
             */
            private String author = System.getProperty("user.name");

            /**
             * 组织名称
             */
            private String company = "";

            /**
             * 创建时间
             */
            private String createTime = LocalDateTimeUtil.formatNow(LocalDateTimeUtil.DATEFORMATYYYYMMDDHHMMSS19);

            /**
             * 年份
             */
            private String year = LocalDateTimeUtil.formatNow("yyyy");

        }

    }

    @Data
    public static class DataBaseConfig {

        /**
         *数据库schema oracle为用户名
         */
        private String schema;
    }

    /**
     * 数据表模型属性集合
     */
    private List<ModelAttributes> modelAttributes = new ArrayList<>();


    /**
     * @author hyluan
     * @ClassName: Project
     * @Description: 项目属性  前端项目路径和后端项目路径
     * @date 2018年1月5日 下午1:25:20
     * @Copyright: Copyright (c) 2017 wisedu
     */
    @Setter
    @Getter
    public static class Project {
        /**
         * 后端项目路径
         */
        private String javaProjectPath;
        /**
         * 前端项目路径
         */
        private String viewProjectPath;
    }

    /**
     * @author hyluan
     * @ClassName: ModelAttributes
     * @Description: 数据表模型属性
     * @date 2018年1月5日 下午1:26:01
     * @Copyright: Copyright (c) 2017 wisedu
     */
    @Setter
    @Getter
    public static class ModelAttributes {

        /**
         * 表名称 必须  区分大小写
         */
        private String tableName;

        /**
         * 模块名称
         */
        private String moduleName;

        /**
         * 实体名称
         */
        private String entityName;

        /**
         * java类相关属性
         */
        private JavaAttributes javaAttributes = new JavaAttributes();

        /**
         * 视图相关属性
         */
        private ViewAttributes viewAttributes = new ViewAttributes();

        /**
         * 菜单
         */
        private MenuAttributes menuAttributes = new MenuAttributes();

        /**
         * 列属性hash表  key：列名（java属性，非数据库字段） value：ColumnAttributes 列属性
         */
        private Map<String, ColumnAttributes> columnAttrMap = new HashMap<String, ColumnAttributes>();

        /**
         * 模型扩展属性 用户自定义
         */
        private Map<String, Object> extendAttrMap = new HashMap<String, Object>();

        /**
         * @author hyluan
         * @ClassName: JavaAttributes
         * @Description: java类属性
         * @date 2018年1月5日 下午1:30:00
         * @Copyright: Copyright (c) 2017 wisedu
         */
        @Setter
        @Getter
        public static class JavaAttributes {

            /**
             * 模块名称 默认为 模型名称首字母xiaoxie 例如 模型为User 模块名为user
             */
            private String moduleName;

            /**
             * 模型包子路径 com.lhy.tool  实际包路径等于包名+模块名+模型包子路径
             */
            private String modelPackage = "model";
            /**
             * 服务包子路径 等于包名+模块名 实际包路径等于包名+模块名+模型包子路径
             */
            private String servicePackage = "service";

            /**
             * 控制器子路径 等于包名+模块名 实际包路径等于包名+模块名+模型包子路径
             */
            private String controllerPackage = "web";

            /**
             * mapper.java 等于包名+模块名 实际包路径等于包名+模块名+模型包子路径
             */
            private String mapperPackage = "mapper";

            /**
             * mapper.xml 等于包名+模块名 实际包路径等于包名+模块名+模型包子路径
             */
            private String mapperXmlPackage = "mapper.xml";

            /**
             * 控制器请求映射路径
             */
            private String controllerRequestMapping;
            /**
             * 自定义排序sql语句 例如：  userId asc, userCode desc 默认为空
             */
            private String queryOrderSql = "";

        }

        /**
         * @author hyluan
         * @ClassName: ViewAttributes
         * @Description:视图属性
         * @date 2018年1月5日 下午1:33:03
         * @Copyright: Copyright (c) 2017 wisedu
         */
        @Setter
        @Getter
        public static class ViewAttributes {
            /**
             * 视图相对路径
             */
            private String viewPath;
        }

        /**
         * @author hyluan
         * @ClassName: ColumnAttributes
         * @Description: 模型列属性
         * @date 2018年1月5日 下午1:33:27
         * @Copyright: Copyright (c) 2017 wisedu
         */
        @Setter
        @Getter
        @ToString
        public static class ColumnAttributes {

            /**
             * 别名 即页面显示字段名称 如果为空去数据库字段描述， 如字段描述为空，取字段名称
             */
            private String alias;

            /**
             * 是否是查询条件
             */
            private boolean queryable;

            /**
             * 索引 即排序号
             */
            private int index = 99999;

            /**
             * 是否可为空
             */
            private boolean nullable = true;

            /**
             * 是否唯一
             */
            private boolean uniqueable;

            /**
             * 表格中是否显示该列
             */
            private boolean gridShowable = true;

            /**
             * 编辑表单中是否显示该列
             */
            private boolean formShowable = true;

            /**
             * 前端数据类型  text combobox databox等 各框架有自己的实现
             */
            private String type;

            /**
             * 模型列扩展属性， 用户自定义
             */
            private Map<String, Object> extendAttrMap = new HashMap<>();

        }

        /**
         * @author hyluan
         * @ClassName: MenuAttributes
         * @Description: 菜单属性
         * @date 2018年1月5日 下午1:35:44
         * @Copyright: Copyright (c) 2017 wisedu
         */
        @Setter
        @Getter
        public static class MenuAttributes {

            /**
             * 二级模块名称
             */
            private String moduleName;

            /**
             * 需要生成菜单的角色名称
             */
            private String roleName = "实施管理员";

            /**
             * 父模块名称
             */
            private String parentModuleName;

        }
    }

    @PostConstruct
    public void init() {
        Project project = this.getGlobalConfig().getProject();
        project.setJavaProjectPath(StringUtil.addPathEndSeparator(project.getJavaProjectPath()));
        project.setViewProjectPath(StringUtil.addPathEndSeparator(project.getViewProjectPath()));
        String templatePath = this.getGlobalConfig().getTemplatePath();
        this.getGlobalConfig().setTemplatePath(StringUtil.addPathEndSeparator(templatePath));
        this.getModelAttributes().forEach(modelAttributes1 -> {
            String viewPath = modelAttributes1.getViewAttributes().getViewPath();
            modelAttributes1.getViewAttributes().setViewPath(StringUtil.minPathEndSeparator(viewPath));
        });

    }
}
